package com.gpframework.module.common.domain.vo;

import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.gpframework.common.annotation.Excel;
import com.gpframework.common.enums.MsgLogEnum;
import com.gpframework.common.utils.DateUtils;
import com.gpframework.common.utils.reflect.ReflectUtils;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
import lombok.experimental.Accessors;

import java.util.Date;
import java.util.List;

/**
 * @ClassName CommonPhoneMsgTemplateVo
 * @Author gpframework
 * @Date 2022-04-07
 * @Version 1.0.0
 * @Description 手机短信模板Vo对象
 */
@Data
@ToString
@EqualsAndHashCode
@NoArgsConstructor
@Accessors(chain = true)
public class CommonPhoneMsgTemplateVo {
    private static final long serialVersionUID = 1L;

    /**
     * 主键
     */
    @ApiModelProperty("主键")
    private Long phoneMsgTemplateId;

    /**
     * 品牌id
     */
    @Excel(name = "品牌id")
    @ApiModelProperty("品牌id")
    private Long brandId;

    /**
     * 门店id
     */
    @Excel(name = "门店id")
    @ApiModelProperty("门店id")
    private Long storeId;

    /**
     * 消息类型
     */
    @Excel(name = "消息类型")
    @ApiModelProperty("消息类型")
    private String msgType;

    /**
     * 业务类型
     */
    @Excel(name = "业务类型")
    @ApiModelProperty("业务类型")
    private String businessType;

    /**
     * 业务名称
     */
    @Excel(name = "业务名称")
    @ApiModelProperty("业务名称")
    private String businessName;

    /**
     * 标题
     */
    @Excel(name = "标题")
    @ApiModelProperty("标题")
    private String title;

    /**
     * accessKeyId
     */
    @Excel(name = "accessKeyId")
    @ApiModelProperty("accessKeyId")
    private String accessKeyId;

    /**
     * 访问的域名
     */
    @Excel(name = "访问的域名")
    @ApiModelProperty("访问的域名")
    private String endpoint;

    /**
     * accessKeySecret
     */
    @Excel(name = "accessKeySecret")
    @ApiModelProperty("accessKeySecret")
    private String accessKeySecret;

    /**
     * 签名
     */
    @Excel(name = "签名")
    @ApiModelProperty("签名")
    private String signName;

    /**
     * 模板code
     */
    @Excel(name = "模板code")
    @ApiModelProperty("模板code")
    private String templateCode;

    /**
     * 模版内容
     */
    @Excel(name = "模版内容")
    @ApiModelProperty("模版内容")
    private String templateContent;

    /**
     * 模板参数数组JSON
     */
    @Excel(name = "模板参数数组JSON")
    @ApiModelProperty("模板参数数组JSON")
    private String templateParamsJson;

    /**
     * 扣除数量
     */
    @Excel(name = "扣除数量")
    @ApiModelProperty("扣除数量")
    private String deductionsNum;

    /**
     * 排序
     */
    @Excel(name = "排序")
    @ApiModelProperty("排序")
    private Long sort;

    /**
     * 备注
     */
    @Excel(name = "备注")
    @ApiModelProperty("备注")
    private String remarks;

    /**
     * 创建者
     */
    @ApiModelProperty("创建者")
    private String createBy;

    /**
     * 创建时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty("创建时间")
    private Date createTime;

    /**
     * 更新者
     */
    @ApiModelProperty("更新者")
    private String updateBy;

    /**
     * 更新时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty("更新时间")
    private Date updateTime;

    /**
     * 发送的内容
     */
    @Excel(name = "发送的内容")
    @ApiModelProperty("发送的内容")
    private String sendContent;


    /**
     * 构建消息内容
     * 模板规范：{{{门店}}}、{{{名称}}}
     *
     * @param phoneMsgTemplateVo
     * @param to
     * @return
     */
    public static <T> CommonPhoneMsgTemplateVo builderMsgContent(CommonPhoneMsgTemplateVo phoneMsgTemplateVo, T to) {
        if (phoneMsgTemplateVo == null || to == null) {
            return null;
        }
        String content = phoneMsgTemplateVo.getTemplateContent(); // 模板内容
        // 模板没设置内容，设置参数
        if (com.gpframework.common.utils.StringUtils.isBlank(content)) {
            phoneMsgTemplateVo.setSendContent(content);
            return phoneMsgTemplateVo;
        }
        // 没有设置参数json，则直接返回内容。
        if (com.gpframework.common.utils.StringUtils.isBlank(phoneMsgTemplateVo.getTemplateParamsJson())) {
            phoneMsgTemplateVo.setSendContent(content);
            return phoneMsgTemplateVo;
        }
        StringBuilder contentBuilder = new StringBuilder(content);
        List<TemplateParamsJsonVo> paramsJsonVos = JSON.parseArray(phoneMsgTemplateVo.getTemplateParamsJson(),
                TemplateParamsJsonVo.class); // 消息模板参数json
        // 替换数据。
        for (TemplateParamsJsonVo paramsJsonVo : paramsJsonVos) {
            try {
                Object fieldValue = ReflectUtils.getFieldValue(to, paramsJsonVo.getKey());
                // 如果是时间则格式化。
                if (fieldValue instanceof Date) {
                    fieldValue = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, (Date) fieldValue);
                }
                // 规范示例：{{{门店}}}
                String spec = MsgLogEnum.TEMPLATE_PARAMS_JSON_SPE_LEFT.getKey() + paramsJsonVo.getDesc()
                        + MsgLogEnum.TEMPLATE_PARAMS_JSON_SPE_RIGHT.getKey();
                com.gpframework.common.utils.StringUtils.replace(contentBuilder, spec, fieldValue == null ? "" : fieldValue.toString());
            } catch (Exception e) {
                throw e;
            }
        }
        phoneMsgTemplateVo.setSendContent(contentBuilder.toString());
        return phoneMsgTemplateVo;
    }
}
